#ifndef FILE_H
#define FILE_H

#include <stdint.h>


#define MAGIC_NUMBER 0xdec0de       // magic number of file system
#define MAX_BLOCK 4096              // maximum size of block array
#define MAX_INODE 1024              // maximum size of inode array
#define BLOCK_MAP_LEN 128           // length of block map array
#define INODE_MAP_LEN 32            // length of inode map array
#define MAX_UINT32 0xffffffff       // maximum number of unsigned int 32

enum file_type
{
    T_FILE,
    T_DIRECTORY
};

typedef struct super_block {
    int32_t magic_num;                  // 幻数
    int32_t free_block_count;           // 空闲数据块数
    int32_t free_inode_count;           // 空闲inode数
    int32_t dir_inode_count;            // 目录inode数
    uint32_t block_map[BLOCK_MAP_LEN];            // 数据块占用位图
    uint32_t inode_map[INODE_MAP_LEN];             // inode占用位图
} sp_block;


typedef struct inode {
    uint32_t size;              // 文件大小
    uint16_t file_type;         // 文件类型（文件/文件夹）
    uint16_t link;              // 连接数
    uint32_t block_point[6];    // 数据块指针
} inode_t;


typedef struct dir_item {               // 目录项一个更常见的叫法是 dirent(directory entry)
    uint32_t inode_id;          // 当前目录项表示的文件/目录的对应inode
    uint16_t valid;             // 当前目录项是否有效 
    uint8_t type;               // 当前目录项类型（文件/目录）
    char name[121];             // 目录项表示的文件/目录的文件名/目录名
} dir_item_t;



void boot_loader();


uint32_t open_path(char *path);
uint32_t open_by_inode(uint32_t inode_num, char *path);

uint32_t create_fd(uint32_t p_inum, char *file_name, uint16_t file_type);
uint32_t list_dir(uint32_t inode_num);
uint32_t copy_file(uint32_t src_inum, uint32_t dst_pinum, char *dst_name);

#endif 